package tankgame6;

public class Shot implements Runnable{
    int x;
    int y;
    int direct;
    int speed=4;
    boolean isLive = true;

    public Shot(int x, int y, int direct) {
        this.x = x;
        this.y = y;
        this.direct = direct;
    }

    /**
     * 坐标慢慢变化，
     * 出了画面就false，
     * 只要属性已经false，这里接收到后，线程可以终结（包括对象终结操作）
     *
     */
    @Override
    public void run() {
        while (true) {
            if(!(x>=0 && x<1000 && y>=0 && y<650 && isLive)){
                isLive=false;
                break;
            }
            //每个子弹的isLive属性在其他地方也会设置，
            //  比如画我方坦克，敌人坦克时候，会遍历自己子弹集合，发现false，然后remove掉元素集合
            if(!isLive)  break;
            /**
             * try catch限制变化频率，不让瞬间变化，留下变化过程
             *
             * 最好情况是，这里变化频率和面板刷新频率一样，
             * 这样不至于这里已经变化一次，但是面板刷新时候只能显示出这里刷新两次后结果，
             * 使得这里没有被画出来的那次变化，就没有实际意义
             */
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            switch (direct) {
                case 0://上
                    y-=speed;
                    break;
                case 1://right
                    x+=speed;
                    break;
                case 2://down
                    y+=speed;
                    break;
                case 3://left
                    x-=speed;
                    break;
            }//switch
            /**
             * 不能把对象从集合里删除原因：
             *              子弹只是在某一个对象的集合属性里面的一个元素，
             *              所以没有代码可以表示出：这个对象是那个对象集合属性里面的元素，
             *              所以不能从子弹集合里删除子弹对象。
             *              所以只能给该对象isLive属性--->false
             *
             *              下次在坦克里挨个看Shot对象时，用isLive判断此元素是否是需要被删除
             *
             * 不好的解决办法：
             *              在Mypaint的run方法里，反复执行代码：
             *              遍历我方坦克，敌人坦克的子弹集合，
             *              把isLive==false的对象从具体对象的集合中删除，
             *              这样在repaint就能只用shot！=null判断要不要画
             *
             *              缺点：计算量很大，坦克多，每个坦克还有不止一个子弹
             *
             * 最好办法：
             *              判断子弹画不画用：
             *              isLive和shot！=null
             *              画的时候！！！！：发现shot为false，但是还在集合里，在那个时候再去从集合里删除该对象
             *
             *
             */
        }//while
    } //run

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }
}
